/* 数据类型 */
// 不区分整数和浮点数
// NaN 表示 not a number，无法计算时用 Nan 表示
// Infinity 表示无限大

// 运算
// 同 C 语言
// 可以用其他进制
0xab + 0o77 + 0b0010100010 + 666

/* 字符串 */
// 不区分字符和字符串、单引号和双引号
var s = 'abc\x0a';
// 也可以用索引访问
s[2];  // c

/* bool */
// true
// false
// && || !

/* 比较运算符 */
// * 相等运算符：
// '==' : 会自动转换数据类型再比较
// '===' : 不会转换数据类型，如果数据类型不一致，则返回 false ，一致再比较
// 所以建议不要用 '==' 比较

// Nan 和所有东西都不相等
// 只能靠 isNaN(NaN) 判断

// 浮点数比较时，比如 1 / 3 === (1 - 2 / 3) -> false
1 / 3 === (1 - 2 / 3);

/* null & undefined */
// null 表示 "空"
// undefined 表示值未定义

/* 数组 */
// 类似 python
[1, 2, 3.14, 'Hello', null, true, NaN];

// 也可以: 
new Array(1, 2, 3, NaN);
// 不过可读性差一点，建议用第一种

// 数组变量
var arr = [1, 'a', 'OHHHHH', "Hello", null, true];
arr[0];
arr[5];
// undefined
arr[10];

/* 对象 */
// 键值对
var person = {
    name: "Lucca9102",
    age: 20,
    tags: ['single', 'code', 'vegetable'],
    city: 'Beijing',
    teacher: 'Liao Xuefeng'
}
// 访问
person.name;
person.tags;

/* 变量 */
// 命名规则，不用说也知道了吧
// 赋值
var x = 10;
x = x + 2;
x += 4;
x %= 3;
console.log(x);

/* strict 模式 */
// 在 JS 设计之初，为了方便学习，不强制使用 var 声明变量。
// 这导致了严重的后果：
// 如果一个变量未经 var 声明就使用，那么这个变量会被自动声明为全局变量
// 如果一个页面的不同 JS 文件都不使用 var ，而恰好又有同名变量，就会导致神秘的错误

// 为了避免这种情况，可以启用 strict 模式
// 方法是在第一行写上：
'use strict';
// 如果浏览器支持 strict 模式，则会在上述情况出现时报错
// 不支持则会将这句话识别为字符串